package com.lyf.juc.practice.jmmvolatile;

import java.util.concurrent.TimeUnit;

/**
 * 一、两大特性
 * 1. 保证有序性
 * 2. 保证可见性
 * -无法保证原子性（
 * 实际的读写过程有八步-- read load        store  write  lock unclock
 * 理解 内存分配的 线程私有和共有 已经 该处的 可见性问题---主内存和工作内存--
 * --探讨的是线程间的共享变量-
 *
 * @author LYF
 * @date 2022/7/8
 */
public class VolatileTests {

    private volatile boolean flag1=true;

    private static volatile boolean flag2=true;

    // 在同一个堆区共享--
    public void method1(){
           new Thread(()->{
               while (true){
                   System.out.println(Thread.currentThread().getName()+"::"+flag1);
                   try {
                       TimeUnit.SECONDS.sleep(1);
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
               }
           },"thread-1").start();
    }

    public void method2(){
        new Thread(()->{
            while (true){
                //System.out.println(Thread.currentThread().getName()+"::"+flag1);
                System.out.println(Thread.currentThread().getName()+":::update"+flag1);
                flag1=false;
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"thread-2").start();
    }

    public static void main(String[] args) throws InterruptedException {
            VolatileTests volatileTests = new VolatileTests();
            volatileTests.method1();
            TimeUnit.SECONDS.sleep(3);
            volatileTests.method2();
    }
}
